package com.project.utils.redis;



import java.util.Properties;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * <p>ClassName: RedisUtil</p>
 * <p>Description: 操作redis缓存的工具类</p>
 * @Author  bsq
 * @Date: 2019年3月8日
 */
public  class RedisUtil {
	
	
	
//	// Redis 服务器 IP
//    private String address = "192.168.200.137";
//    
//    // Redis的端口号
//    private int port = 6379;
//    
//    // 访问密码
//    private String password = "hxgk";
//    
//    // 连接 redis 等待时间
//    private int timeOut = 10000;
//    
//    // 可用连接实例的最大数目，默认值为8；
//    // 如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)
//    private int maxTotal = 1024;
//    
//    // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例，默认值也是8
//    private int maxIdle = 200;
//    
//    // 等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。如果超过等待时间，则直接抛出JedisConnectionException
//    private int maxWait = 10000;
//    
//    // 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的
//    private boolean testOnBorrow = true;
	
	
    
    // 连接池
    private static JedisPool jedisPool=null;
    
    private static String redisConfigFile = "redis.properties";
	//把redis连接对象放到本地线程中
	private static ThreadLocal<Jedis> local=new ThreadLocal<Jedis>();
    
	//不允许通过new创建该类的实例
	private RedisUtil() {
	}
    
    // 构造函数
//    public RedisUtil() {
//        try {
//            JedisPoolConfig config = new JedisPoolConfig();
//            config.setMaxTotal(maxTotal);
//            config.setMaxIdle(maxIdle);
//            config.setMaxWaitMillis(maxWait);
//            config.setTestOnBorrow(testOnBorrow);
//            jedisPool = new JedisPool(config, address, port, timeOut, password);
//        } catch(Exception e) {
//            e.printStackTrace();
//        }
//    }
    
    
    
    /**
	 * 初始化Redis连接池
	 */
	public static void initialPool() {
		try {
			Properties props = new Properties();
			//加载连接池配置文件
			props.load(RedisUtil.class.getClassLoader().getResourceAsStream(redisConfigFile));
			// 创建jedis池配置实例
			JedisPoolConfig config = new JedisPoolConfig();
			// 设置池配置项值
			config.setMaxTotal(Integer.valueOf(props.getProperty("redis.maxTotal")));
			config.setMaxIdle(Integer.valueOf(props.getProperty("redis.maxIdle")));
			config.setMaxWaitMillis(Long.valueOf(props.getProperty("redis.maxWaitMillis")));
			config.setTestOnBorrow(Boolean.valueOf(props.getProperty("redis.testOnBorrow")));
			config.setTestOnReturn(Boolean.valueOf(props.getProperty("redis.testOnReturn")));
			// 根据配置实例化jedis池
			jedisPool = new JedisPool(config, props.getProperty("redis.host"),
					Integer.valueOf(props.getProperty("redis.port")),
					Integer.valueOf(props.getProperty("redis.timeout")),
					props.getProperty("redis.passWord"));
			System.out.println("线程池被成功初始化");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    
    
    // 获取 Jedis 实例
    public static Jedis getJedis() {
        if (jedisPool == null) 
        	initialPool(); 
            return jedisPool.getResource();
        
    }
    
    /**
	 * 获得连接
	 * @return Jedis
	 */
	public static Jedis getConn() { 
		//Redis对象
        Jedis jedis =local.get();
        if(jedis==null){
        	if (jedisPool == null) {    
            	initialPool();  
            }
        	jedis = jedisPool.getResource();
        	local.set(jedis);
        }
        return jedis;  
    }
	
    
  //新版本用close归还连接
  	public static void closeConn(){
  		//从本地线程中获取
  		Jedis jedis =local.get();
  		if(jedis!=null){
  			jedis.close();
  		}
  		local.set(null);
  	}

    
	//关闭池
	public static void closePool(){
		if(jedisPool!=null){
			jedisPool.close();
		}
	}    

}

